package com.urbane.util.properties;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * JWT配置属性类
 * 用于接收和绑定application.yml中以"jwt"为前缀的JWT相关配置项
 *
 * @author urbane
 * @since 1.0.0
 */
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = JwtProperties.PREFIX)
public class JwtProperties {

    /**
     * 配置属性前缀常量
     * 对应配置文件中的 jwt 前缀
     */
    public static final String PREFIX = "jwt";

    /**
     * JWT 签名密钥（Base64编码格式）
     * 从application.yml配置文件中注入，例如：jwt.secret=your-256-bit-secret-your-256-bit-secret-
     * 注意：生产环境务必使用复杂且保密的密钥，并通过安全的方式（如环境变量、配置中心）管理，切勿硬编码在代码中！
     * 建议使用至少256位的密钥以确保安全性
     */
    private String secret;

    /**
     * JWT 过期时间（毫秒）
     * 从配置文件中注入，例如：jwt.expiration=86400000 (24小时)
     * 设置为0或负数表示永不过期（不推荐）
     */
    private long expiration;

    /**
     * JWT 刷新令牌过期时间（毫秒）
     * 用于生成刷新令牌的有效期，通常比访问令牌有效期更长
     * 例如：jwt.refresh-expiration=604800000 (7天)
     */
    private long refreshExpiration = 604800000L;

    /**
     * JWT 发行者
     * 标识JWT的签发者，例如：jwt.issuer=urbane-commerce
     */
    private String issuer = "urbane-commerce";

    /**
     * JWT 接收者
     * 标识JWT的接收者，例如：jwt.audience=web-app
     */
    private String audience;

    /**
     * JWT 头部声明类型
     * 指定JWT的类型，默认为JWT
     * 例如：jwt.header-type=JWT
     */
    private String headerType = "JWT";

    /**
     * JWT 头部内容类型
     * 指定JWT的内容类型，默认为JWT
     * 例如：jwt.header-content-type=JWT
     */
    private String headerContentType = "JWT";

    /**
     * JWT 在HTTP头部中的名称
     * 客户端在请求时应使用此名称传递JWT令牌
     * 例如：jwt.header-name=Authorization
     */
    private String headerName = "Authorization";

    /**
     * JWT 令牌前缀
     * 在HTTP头部中JWT令牌的前缀，通常为Bearer
     * 例如：jwt.token-prefix=Bearer
     */
    private String tokenPrefix = "Bearer ";

    /**
     * 是否在JWT中包含用户角色信息
     * 设置为true时，将在JWT的payload中包含用户的角色信息
     * 例如：jwt.include-roles=true
     */
    private boolean includeRoles = true;

    /**
     * 是否在JWT中包含用户权限信息
     * 设置为true时，将在JWT的payload中包含用户的权限信息
     * 例如：jwt.include-permissions=true
     */
    private boolean includePermissions = true;

    /**
     * 获取完整的JWT头部值格式
     * 返回格式为：Bearer token
     *
     * @param token JWT令牌字符串
     * @return 完整的头部值
     */
    public String getFullHeader(String token) {
        return this.tokenPrefix + token;
    }

    /**
     * 获取去除前缀的令牌
     * 从完整的头部值中提取实际的JWT令牌
     *
     * @param fullToken 完整的头部值（包含前缀）
     * @return 实际的JWT令牌
     */
    public String getTokenWithoutPrefix(String fullToken) {
        if (fullToken != null && fullToken.startsWith(this.tokenPrefix)) {
            return fullToken.substring(this.tokenPrefix.length());
        }
        return fullToken;
    }

}
